import pymysql

id = '20120001'
user = 'Bob'
age = 20

id2 = '20120002'
user2 = 'Tom'
age2 = 20

db = pymysql.connect(host='localhost',user='root',password='123456',port= 3306,db='spiders')
cursor = db.cursor()
sql_1 = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
sql_2 = 'INSERT INTO students(id, name, age) values("' + id2 + '","' + user2 + '","' + str(age2) + '")'
try:
    cursor.execute(sql_1, (id, user, age))
    #需要执行db对象的commit()方法才可以实现数据插入
    # ——这个方法才是真正将语句提交到数据库执行的方法；对于数据插入、更新、删除操作，都需要调用该方法才能生效
    db.commit()
    cursor.execute(sql_2)
    db.commit()
except:
    # 如果执行失败，则调用rollback()执行数据回滚，相当于什么都没有发生过
    db.rollback()
db.close()


'''
注意1：主键相同是会报错的
注意2：sql_2的写法繁琐且不直观，选择直接用格式化符%s来实现
    有几个Value写几个%s，只需在execute()方法的第一个参数传入该SQL语句，Value值用统一元组传过来就好了
    避免字符串拼接的麻烦，又可以避免引号冲突的问题
注意3：事务的4个属性
    原子性：事务是一个不可分割的工作单位，事务中包括的组操作要么都做，要么都不做
    一致性：事务必须是数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
    隔离性
    持久性
    
注意4：插入、更新、删除操作都是对数据库进行更改的操作，而更改操作都必须为一个事务，所以这些操作的标准写法就是：
        try:
            cursor.execute(sql_1)
            db.commit()
        except:
            db.rollback()
'''